/*
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at
 * 
 *    http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */
package examples;

import java.io.IOException;
import java.util.Date;
import java.util.Random;

import org.jsmpp.InvalidResponseException;
import org.jsmpp.PDUException;
import org.jsmpp.bean.Alphabet;
import org.jsmpp.bean.BindType;
import org.jsmpp.bean.ESMClass;
import org.jsmpp.bean.GeneralDataCoding;
import org.jsmpp.bean.MessageClass;
import org.jsmpp.bean.NumberingPlanIndicator;
import org.jsmpp.bean.OptionalParameter;
import org.jsmpp.bean.OptionalParameters;
import org.jsmpp.bean.RegisteredDelivery;
import org.jsmpp.bean.SMSCDeliveryReceipt;
import org.jsmpp.bean.TypeOfNumber;
import org.jsmpp.extra.NegativeResponseException;
import org.jsmpp.extra.ResponseTimeoutException;
import org.jsmpp.session.BindParameter;
import org.jsmpp.session.SMPPSession;
import org.jsmpp.util.AbsoluteTimeFormatter;
import org.jsmpp.util.TimeFormatter;

/**
 * @author uudashr
 * 
 */
public class SubmitLongMessageExample {
	private static TimeFormatter timeFormatter = new AbsoluteTimeFormatter();;

	public static void main(String[] args) {
		int a = 0111111;
		System.out.println(a);
		SMPPSession session = new SMPPSession();
		try {
			session.connectAndBind(ExampleContent.host, ExampleContent.port,
					new BindParameter(BindType.BIND_TRX,
							ExampleContent.systemid, ExampleContent.password,
							ExampleContent.systemtype, TypeOfNumber.UNKNOWN,
							NumberingPlanIndicator.UNKNOWN, null));
		} catch (IOException e) {
			System.err.println("Failed connect and bind to host");
			e.printStackTrace();
		}
		Random random = new Random();

		final int totalSegments = 3;
		OptionalParameter sarMsgRefNum = OptionalParameters
				.newSarMsgRefNum((short) random.nextInt());
		OptionalParameter sarTotalSegments = OptionalParameters
				.newSarTotalSegments(totalSegments);

		for (int i = 0; i < totalSegments; i++) {
			final int seqNum = i + 1;
			String message = "Message part " + seqNum + " of " + totalSegments
					+ " ";
			OptionalParameter sarSegmentSeqnum = OptionalParameters
					.newSarSegmentSeqnum(seqNum);
			String messageId = submitMessage(session, message, sarMsgRefNum,
					sarSegmentSeqnum, sarTotalSegments);
			System.out.println("Message submitted, message_id is " + messageId);
		}

		session.unbindAndClose();
	}

	public static String submitMessage(SMPPSession session, String message,
			OptionalParameter sarMsgRefNum, OptionalParameter sarSegmentSeqnum,
			OptionalParameter sarTotalSegments) {
		String messageId = null;
		try {
			String source_address = "8615619281958";
			String rcvMobile = "8613572447543";
			messageId = session.submitShortMessage("CMT",
					TypeOfNumber.INTERNATIONAL, NumberingPlanIndicator.UNKNOWN,
					source_address, TypeOfNumber.INTERNATIONAL,
					NumberingPlanIndicator.UNKNOWN, rcvMobile, new ESMClass(),
					(byte) 0, (byte) 1, timeFormatter.format(new Date()), null,
					new RegisteredDelivery(SMSCDeliveryReceipt.DEFAULT),
					(byte) 0, new GeneralDataCoding(false, true,
							MessageClass.CLASS1, Alphabet.ALPHA_DEFAULT),
					(byte) 0, message.getBytes(), sarMsgRefNum,
					sarSegmentSeqnum, sarTotalSegments);
			;
		} catch (PDUException e) {
			// Invalid PDU parameter
			System.err.println("Invalid PDU parameter");
			e.printStackTrace();
		} catch (ResponseTimeoutException e) {
			// Response timeout
			System.err.println("Response timeout");
			e.printStackTrace();
		} catch (InvalidResponseException e) {
			// Invalid response
			System.err.println("Receive invalid respose");
			e.printStackTrace();
		} catch (NegativeResponseException e) {
			// Receiving negative response (non-zero command_status)
			System.err.println("Receive negative response");
			e.printStackTrace();
		} catch (IOException e) {
			System.err.println("IO error occur");
			e.printStackTrace();
		}
		return messageId;
	}
}
